package com.itbaizhan.mapper;

import com.itbaizhan.pojo.PageQuery;
import com.itbaizhan.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/*1,编写接口，2，配置好映射文件（UserMapper.xml）和SqlMapConfig.xml文件
* 3，直接在test中测试  因为映射文件实现了接口 封装了JDB语句*/
/*sql语句写在映射文件中*/
//映射文件实现了接口
public interface UserMapper {
    List<User> findAll();
    void add(User user);
    void update(User user);
    void delete(int userid);
    //根据id查询用户  返回一个用户
    User selectById(int userid);
    //模糊查询
    List<User> findUserByName(String username);
    /*分页查询
    顺序传参
Sql中的参数使用arg0，arg1...或param1，param2...表示参数的顺序。
此方法可读性较低，在开发中不建议使用。
    @param startIndex 开始索引
    @param pageSize 每页条数*/
    List<User> findPage(int startIndex, int pageSize);

    /*分页查询
    @Param传参
在接口方法的参数列表中通过@Param定义参数名称，
在Sql语句中通过注解中所定义的参数名称指定参数位置。
在映射文件中，把Param括号中的名称放进#{}中
此方式参数比较直观的，推荐使用*/
    List<User> selectPage(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);
/*分页查询
* 自定义POJO类，该类的属性就是要传递的参数，在SQL语句中绑定参数时使用
* POJO的属性名作为参数名即可。此方式推荐使用。*/
    List<User> findPage1(PageQuery pageQuery);

    /*分页查询
    * 使用Map作为传递参数的载体，在SQL语句中绑定参数时使用Map的Key
    * 作为参数名即可。此方法推荐使用。
    * 在MyBatis中使用Map传参，Map键的类型为 String*/
    List<User> findPage2(Map<String,Object> params);

    /*查询用户总数*/
    int findCount();

    /*主键回填
    * 有时我们需要获取新插入数据的主键值。如果数据库中主键是自增的，
    * 这时我们就需要使用MyBatis的主键回填功能。*/
    void add2(User user);





}
/*映射文件注意事项：

映射文件名称要和接口名称相同。

映射文件要和接口的目录结构相同

映射文件中namespace属性要写接口的全名。

映射文件中标签的id属性是接口方法的方法名。

映射文件中标签的resultType属性是接口方法的返回值类型。

映射文件中标签的parameterType属性是接口方法的参数类型。

映射文件中resultType、parameterType属性要写全类名，
如果是集合类型，则写其泛型的全类名。

*/

/*MyBatis核心对象
SqlSessionFactoryBuilder

SqlSession工厂构建者对象，使用构造者模式创建SqlSession工厂对象。

SqlSessionFactory

SqlSession工厂，使用工厂模式创建SqlSession对象。

SqlSession

该对象可以操作数据库，也可以使用动态代理模式创建持久层接口的代理对象操作数据库。

Mapper

持久层接口的代理对象，他具体实现了持久层接口，用来操作数据库。

MyBatis工作流程
创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder对象构建了SqlSessionFactory对象：构造者模式

SqlSessionFactory对象生产了SqlSession对象：工厂模式

SqlSession对象创建了持久层接口的代理对象：动态代理模式

代理对象操作数据库*/